package org.jeecg.modules.manage.technology.util;

import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.tika.Tika;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

/**
 * PDF解析工具类
 * 使用Apache Tika解析PDF内容
 *
 * @Author: jeecg-boot
 * @Date: 2025-11-04
 * @Version: V1.0
 */
@Slf4j
@Component
public class PdfParseUtil {

    private final Tika tika;

    public PdfParseUtil() {
        // 初始化Tika解析器
        this.tika = new Tika();
    }

    /**
     * 解析PDF文件内容
     *
     * @param pdfBytes PDF文件字节数组
     * @return 解析后的文本内容，如果失败返回空字符串
     */
    public String parsePdfContent(byte[] pdfBytes) {
        if (pdfBytes == null || pdfBytes.length == 0) {
            log.warn("PDF字节数组为空");
            return "";
        }

        try {
            log.info("开始解析PDF内容，文件大小：{} bytes", pdfBytes.length);

            try (InputStream inputStream = new ByteArrayInputStream(pdfBytes)) {
                String content = tika.parseToString(inputStream);

                // 清理和格式化内容
                if (StrUtil.isNotEmpty(content)) {
                    // 移除多余的空白字符，保留基本格式
                    content = content.replaceAll("\\s+", " ").trim();

//                    // 限制内容长度，避免token过多（保留前5000字符）
//                    if (content.length() > 5000) {
//                        content = content.substring(0, 5000) + "...";
//                        log.info("PDF内容过长，已截取前5000字符");
//                    }

                    log.info("PDF解析成功，内容长度：{} 字符", content.length());
                    return content;
                } else {
                    log.warn("PDF解析结果为空");
                    return "";
                }
            }

        } catch (Exception e) {
            log.error("解析PDF内容失败：{}", e.getMessage(), e);
            return "";
        }
    }

    /**
     * 检查URL是否为PDF文件
     *
     * @param fileUrl 文件URL
     * @return 是否为PDF文件
     */
    public boolean isPdfFile(String fileUrl) {
        if (StrUtil.isEmpty(fileUrl)) {
            return false;
        }
        return fileUrl.toLowerCase().endsWith(".pdf");
    }
}
